package com.ruoyi.server;

import org.eclipse.paho.client.mqttv3.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

@Component
public class MqttListener implements MqttCallback {

    @Resource
    private MqttClient mqttClient;
    @Value("${mqtt.default-topic}")
    private String defaultTopic;
    @Resource
    private MqttConnectOptions mqttConnectOptions; // 注入 MqttConnectOptions 对象
    // 初始化时订阅主题（容器启动后执行）
    @PostConstruct
    public void subscribe() {
        try {

            mqttClient.setCallback(this); // 设置回调
//            mqttClient.subscribe(defaultTopic, 0); // 订阅默认主题（QoS 0）
            // 订阅 testtopic 下的所有一级子主题
//            mqttClient.subscribe("testtopic/+", 1);
            mqttClient.subscribe("test/topic", 0);
//            mqttClient.subscribe("testtopic/jay/soil_sensor_moisture", 0); // 订阅默认主题（QoS 0）
            System.out.println("已订阅主题：" + defaultTopic);
        } catch (MqttException e) {
            System.err.println("订阅主题失败：" + e.getMessage());
            e.printStackTrace();
        }
    }

    // 消息到达时的回调（处理业务逻辑）
    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        try {
            System.out.println("Received >> topic:" +topic+ new String(message.getPayload()));
        } catch (Exception e) {
            System.err.println("消息处理异常：" + e.getMessage()); // 添加异常捕获
        }
    }

    // 连接丢失时的回调（可实现重连逻辑）
    // 连接丢失时的回调（可实现重连逻辑）
    @Override
    public void connectionLost(Throwable cause) {
        System.err.println("MQTT 连接丢失：" + cause.getMessage());
        new Thread(() -> {
            try {
                Thread.sleep(5000); // 等待 5 秒后重连
                mqttClient.connect(mqttConnectOptions); // 使用注入的 MqttConnectOptions 对象进行重连
                subscribe(); // 重新订阅主题
                System.out.println("MQTT 重连成功");
            } catch (Exception e) {
                System.err.println("重连失败：" + e.getMessage());
                e.printStackTrace();
            }
        }).start();
    }

    // 消息发布完成的回调（发布 QoS ≥1 时使用）
    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        // 可选：处理消息确认
    }
}